package com.util;

import net.coobird.thumbnailator.Thumbnails;

import java.io.File;
import java.io.IOException;

/**
 * @author: cxt
 * @time: 2021/7/7
 * <p>
 * 图片工具类：按比例压缩，按大小压缩，
 */
public class CompressFileUtil {

    // 压缩后名称后缀
    private static final String SUFFIX = "-thumbnail";

    // 常见的格式
    private static final String[] FORMAT = new String[]{"webp", "bmp", "jpg", "png", "tif", "gif", "apng"};

    /**
     * 生成压缩的文件路径名
     *
     * @param fileName 文件名称
     * @param path     压缩后存放的路径
     * @return 返回压缩的文件路径名
     */
    public static String createFileName(String fileName, String path) {
        int i = fileName.lastIndexOf(".") + 1;
        return path + fileName.substring(0, i - 1) + SUFFIX + "." + fileName.substring(i);
    }

    /**
     * 等比例压缩图片,大小和尺寸都会变
     *
     * @param file  需要压缩的文件
     * @param scale 压缩比例：大于1就是放大，繁殖缩小
     * @param path  压缩后文件存储路径
     * @throws IOException
     */
    public static void byProportion(File file, double scale, String path) throws IOException {
        if (file != null && file.isFile()) {
            String filePath = createFileName(file.getName(), path);
            Thumbnails.of(file).scale(scale).toFile(new File(filePath));
        }
    }

    /**
     * 按大小压缩图片
     * 如果图片比例和给定像素比例不等时候，会将图片进行拉伸
     *
     * @param file 目标图片
     * @param w    压缩后的宽
     * @param h    压缩后的高
     * @param path 压缩后文件存储路径
     */
    public static void bySize(File file, int w, int h, String path) throws IOException {
        if (file != null && file.isFile()) {
            String filePath = createFileName(file.getName(), path);
            Thumbnails.of(file).size(w, h).keepAspectRatio(false).toFile(filePath);
        }
    }

    /**
     * 保持大小，压缩质量
     *
     * @param file 目标图片
     * @param f    压缩量
     * @param path 压缩后文件存储路径
     * @throws IOException
     */
    public static void byQuality(File file, float f, String path) throws IOException {
        if (file != null && file.isFile()) {
            String filePath = createFileName(file.getName(), path);
            Thumbnails.of(file).scale(1).outputQuality(f).toFile(filePath);
        }
    }

    /**
     * 测试
     */
    public static void main(String[] args) throws IOException {
        // 等比例压缩
        // equalProportion(new File("E://11.jpg"), 0.8, "E://");

        // 按大小压缩
        // bySize(new File("E://11.jpg"), 1280, 800, "E://");

        // 按质量压缩，大小不变
        byQuality(new File("E://11.jpg"), 0.11f, "E://");
    }
}
